/*
 * UART_K230.h - UART K230通信驱动头文件
 * 适用于MSPM0G3507微控制器
 * 专门用于与K230开发板进行串口通信
 */

#ifndef UART_K230_H_
#define UART_K230_H_

#include "ti_msp_dl_config.h"
#include <stdint.h>
#include <stdbool.h>

// UART_K230缓冲区大小定义
#define UART_K230_TX_BUFFER_SIZE     512
#define UART_K230_RX_BUFFER_SIZE     1024  // 接收缓冲区稍大一些，适合K230数据接收
#define UART_K230_LINE_BUFFER_SIZE   256   // 行缓冲区大一些，适合K230命令

// UART_K230状态定义
typedef enum {
    UART_K230_STATUS_SUCCESS = 0,
    UART_K230_STATUS_ERROR,
    UART_K230_STATUS_BUSY,
    UART_K230_STATUS_TIMEOUT,
    UART_K230_STATUS_BUFFER_FULL,
    UART_K230_STATUS_BUFFER_EMPTY,
    UART_K230_STATUS_LINE_READY
} UART_K230_Status_t;

// UART_K230配置结构体
typedef struct {
    uint32_t baudRate;          // 波特率（默认115200）
    bool enableTxInterrupt;     // 发送中断使能
    bool enableRxInterrupt;     // 接收中断使能
    bool enableLineMode;        // 行模式使能（以换行符为分隔）
    char lineTerminator;        // 行结束符（默认'\n'）
} UART_K230_Config_t;

// UART_K230缓冲区结构体
typedef struct {
    uint8_t buffer[UART_K230_TX_BUFFER_SIZE];
    volatile uint16_t head;
    volatile uint16_t tail;
    volatile uint16_t count;
} UART_K230_TxBuffer_t;

typedef struct {
    uint8_t buffer[UART_K230_RX_BUFFER_SIZE];
    volatile uint16_t head;
    volatile uint16_t tail;
    volatile uint16_t count;
} UART_K230_RxBuffer_t;

// 行缓冲区结构体（用于处理完整的命令行）
typedef struct {
    char buffer[UART_K230_LINE_BUFFER_SIZE];
    volatile uint16_t length;
    volatile bool ready;
    char terminator;
} UART_K230_LineBuffer_t;

// 数据接收回调函数类型
typedef void (*UART_K230_DataCallback_t)(const uint8_t *data, uint16_t length);
typedef void (*UART_K230_LineCallback_t)(const char *line);

// UART_K230句柄结构体
typedef struct {
    UART_Regs *instance;                    // UART实例
    UART_K230_TxBuffer_t txBuffer;          // 发送缓冲区
    UART_K230_RxBuffer_t rxBuffer;          // 接收缓冲区
    UART_K230_LineBuffer_t lineBuffer;      // 行缓冲区
    volatile bool txBusy;                   // 发送忙标志
    volatile bool rxBusy;                   // 接收忙标志
    volatile bool lineMode;                 // 行模式标志
    volatile uint32_t lastActivity;         // 最后活动时间
    UART_K230_DataCallback_t dataCallback; // 数据接收回调
    UART_K230_LineCallback_t lineCallback; // 行接收回调
} UART_K230_Handle_t;

// 函数声明
/**
 * @brief 初始化UART_K230驱动
 * @param handle UART_K230句柄指针
 * @param config UART_K230配置指针
 * @return UART_K230_Status_t 状态码
 */
UART_K230_Status_t UART_K230_Init(UART_K230_Handle_t *handle, const UART_K230_Config_t *config);

/**
 * @brief 反初始化UART_K230驱动
 * @param handle UART_K230句柄指针
 * @return UART_K230_Status_t 状态码
 */
UART_K230_Status_t UART_K230_DeInit(UART_K230_Handle_t *handle);

/**
 * @brief 发送单个字节
 * @param handle UART_K230句柄指针
 * @param data 要发送的数据
 * @return UART_K230_Status_t 状态码
 */
UART_K230_Status_t UART_K230_SendByte(UART_K230_Handle_t *handle, uint8_t data);

/**
 * @brief 发送数据缓冲区
 * @param handle UART_K230句柄指针
 * @param data 数据缓冲区指针
 * @param length 数据长度
 * @return UART_K230_Status_t 状态码
 */
UART_K230_Status_t UART_K230_SendData(UART_K230_Handle_t *handle, const uint8_t *data, uint16_t length);

/**
 * @brief 发送字符串
 * @param handle UART_K230句柄指针
 * @param str 字符串指针
 * @return UART_K230_Status_t 状态码
 */
UART_K230_Status_t UART_K230_SendString(UART_K230_Handle_t *handle, const char *str);

/**
 * @brief 发送字符串并添加换行符
 * @param handle UART_K230句柄指针
 * @param str 字符串指针
 * @return UART_K230_Status_t 状态码
 */
UART_K230_Status_t UART_K230_SendLine(UART_K230_Handle_t *handle, const char *str);

/**
 * @brief 格式化输出（类似printf）
 * @param handle UART_K230句柄指针
 * @param format 格式字符串
 * @param ... 可变参数
 * @return UART_K230_Status_t 状态码
 */
UART_K230_Status_t UART_K230_Printf(UART_K230_Handle_t *handle, const char *format, ...);

/**
 * @brief 接收单个字节
 * @param handle UART_K230句柄指针
 * @param data 接收数据的指针
 * @return UART_K230_Status_t 状态码
 */
UART_K230_Status_t UART_K230_ReceiveByte(UART_K230_Handle_t *handle, uint8_t *data);

/**
 * @brief 接收数据到缓冲区
 * @param handle UART_K230句柄指针
 * @param data 数据缓冲区指针
 * @param length 期望接收的长度
 * @param receivedLength 实际接收的长度指针
 * @param timeout 超时时间（毫秒）
 * @return UART_K230_Status_t 状态码
 */
UART_K230_Status_t UART_K230_ReceiveData(UART_K230_Handle_t *handle, uint8_t *data, uint16_t length, uint16_t *receivedLength, uint32_t timeout);

/**
 * @brief 接收一行数据（以换行符结束）
 * @param handle UART_K230句柄指针
 * @param line 行缓冲区指针
 * @param maxLength 缓冲区最大长度
 * @param timeout 超时时间（毫秒）
 * @return UART_K230_Status_t 状态码
 */
UART_K230_Status_t UART_K230_ReceiveLine(UART_K230_Handle_t *handle, char *line, uint16_t maxLength, uint32_t timeout);

/**
 * @brief 检查是否有完整的行数据可读
 * @param handle UART_K230句柄指针
 * @return bool true表示有完整行数据
 */
bool UART_K230_IsLineReady(UART_K230_Handle_t *handle);

/**
 * @brief 获取接收缓冲区中的数据数量
 * @param handle UART_K230句柄指针
 * @return uint16_t 数据数量
 */
uint16_t UART_K230_GetRxDataCount(UART_K230_Handle_t *handle);

/**
 * @brief 获取发送缓冲区中的空闲空间
 * @param handle UART_K230句柄指针
 * @return uint16_t 空闲空间大小
 */
uint16_t UART_K230_GetTxFreeSpace(UART_K230_Handle_t *handle);

/**
 * @brief 清空接收缓冲区
 * @param handle UART_K230句柄指针
 */
void UART_K230_FlushRxBuffer(UART_K230_Handle_t *handle);

/**
 * @brief 清空发送缓冲区
 * @param handle UART_K230句柄指针
 */
void UART_K230_FlushTxBuffer(UART_K230_Handle_t *handle);

/**
 * @brief 清空行缓冲区
 * @param handle UART_K230句柄指针
 */
void UART_K230_FlushLineBuffer(UART_K230_Handle_t *handle);

/**
 * @brief 设置数据接收回调函数
 * @param handle UART_K230句柄指针
 * @param callback 回调函数指针
 */
void UART_K230_SetDataCallback(UART_K230_Handle_t *handle, UART_K230_DataCallback_t callback);

/**
 * @brief 设置行接收回调函数
 * @param handle UART_K230句柄指针
 * @param callback 回调函数指针
 */
void UART_K230_SetLineCallback(UART_K230_Handle_t *handle, UART_K230_LineCallback_t callback);

/**
 * @brief UART_K230中断处理函数
 * @param handle UART_K230句柄指针
 */
void UART_K230_IRQHandler(UART_K230_Handle_t *handle);

/**
 * @brief 设置行模式
 * @param handle UART_K230句柄指针
 * @param enable 是否启用行模式
 */
void UART_K230_SetLineMode(UART_K230_Handle_t *handle, bool enable);

/**
 * @brief 获取最后活动时间
 * @param handle UART_K230句柄指针
 * @return uint32_t 最后活动时间
 */
uint32_t UART_K230_GetLastActivity(UART_K230_Handle_t *handle);

// 便利函数声明（使用默认句柄）
/**
 * @brief 初始化默认UART_K230（使用系统配置的UART_K230）
 * @return UART_K230_Status_t 状态码
 */
UART_K230_Status_t UART_K230_InitDefault(void);

/**
 * @brief 使用默认UART_K230发送字符串
 * @param str 字符串指针
 * @return UART_K230_Status_t 状态码
 */
UART_K230_Status_t UART_K230_DefaultSendString(const char *str);

/**
 * @brief 使用默认UART_K230发送一行
 * @param str 字符串指针
 * @return UART_K230_Status_t 状态码
 */
UART_K230_Status_t UART_K230_DefaultSendLine(const char *str);

/**
 * @brief 使用默认UART_K230格式化输出
 * @param format 格式字符串
 * @param ... 可变参数
 * @return UART_K230_Status_t 状态码
 */
UART_K230_Status_t UART_K230_DefaultPrintf(const char *format, ...);

/**
 * @brief 使用默认UART_K230接收一行
 * @param line 行缓冲区指针
 * @param maxLength 缓冲区最大长度
 * @param timeout 超时时间（毫秒）
 * @return UART_K230_Status_t 状态码
 */
UART_K230_Status_t UART_K230_DefaultReceiveLine(char *line, uint16_t maxLength, uint32_t timeout);

/**
 * @brief 设置默认UART_K230的数据回调
 * @param callback 回调函数指针
 */
void UART_K230_DefaultSetDataCallback(UART_K230_DataCallback_t callback);

/**
 * @brief 设置默认UART_K230的行回调
 * @param callback 回调函数指针
 */
void UART_K230_DefaultSetLineCallback(UART_K230_LineCallback_t callback);

/**
 * @brief 获取默认UART_K230接收数据数量
 * @return uint16_t 数据数量
 */
uint16_t UART_K230_DefaultGetRxDataCount(void);

/**
 * @brief 检查默认UART_K230是否有完整行数据
 * @return bool true表示有完整行数据
 */
bool UART_K230_DefaultIsLineReady(void);

// 全局默认UART_K230句柄
extern UART_K230_Handle_t g_defaultK230;

#endif /* UART_K230_H_ */ 